package com.chaoli.reggie_diy.controller;

import com.chaoli.reggie_diy.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 图片的上传和下载
 */
@RestController
@RequestMapping("/common")
@Slf4j
public class CommonController {

    @Value("${reggie.imageBaseDir}")
    private String basePath;

    /**
     * 图片上传
     *
     * @param file
     * @return
     * @throws IOException
     */
    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) throws IOException {
        log.info(file.toString());
        log.info("原始文件名为：{}", file.getOriginalFilename());
        log.info("file.getName()的值为：{}", file.getName());

        //file是临时文件，需要转存到指定位置，否则本次请求完成后临时文件自动删除
        //使用uuid重新生成文件名，防止名字重复会进行文件覆盖
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));
        String fileName = UUID.randomUUID() + suffix;

        //如果目录不存在，创建目录
        File dir = new File(basePath);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        file.transferTo(new File(basePath + fileName));
        return R.success(fileName);

    }

    /**
     * 图片下载
     *
     * @param name
     * @param response
     * @return
     */
    @GetMapping("/download")
    public void download(@RequestParam(value = "name") String name, HttpServletResponse response) throws IOException {
        log.info("请求下载的文件：{}", name);
        // 文件路径
        String filePath = basePath + name;
        // 将文件以输入流的形式读取
        FileInputStream fileInputStream = new FileInputStream(filePath);
        // 设置响应字符集
        response.setCharacterEncoding("UTF-8");
        // 设置响应回去的是什么类型的文件
        response.setContentType("image/jpeg");
        // 获取输出流对象
        ServletOutputStream outputStream = response.getOutputStream();
        // 从输入流读取数据,通过输出流响应给浏览器
        int line = 0;
        while ((line = fileInputStream.read()) != -1) {
            outputStream.write(line);
            outputStream.flush();
        }

        // 响应结束,关闭流
        fileInputStream.close();
        outputStream.close();
    }
}
